#include <SD_MMC.h>
#include "ESP32USBMSC.h"
#include <SPIFFS.h>
#include <driver/sdmmc_host.h>
#include <driver/sdmmc_defs.h>
#include <driver/gpio.h>

// SD_MMC 引脚配置，使用 ESP32S3 的 IO 口编号
// 这些引脚需根据实际硬件连接进行调整
// GPIO_NUM_XX 是 ESP-IDF 的枚举类型，代表具体的引脚编号
gpio_num_t clk = GPIO_NUM_40;
gpio_num_t cmd = GPIO_NUM_39;
gpio_num_t d0 = GPIO_NUM_41;
gpio_num_t d1 = GPIO_NUM_42;
gpio_num_t d2 = GPIO_NUM_48;
gpio_num_t d3 = GPIO_NUM_38;
bool onebit = false; // false 表示使用 4-bit 模式，true 表示 1-bit 模式（只用 d0）

// USB 事件回调函数，用于监控 USB 连接状态
void myUsbEventHandler(int32_t event_id, void *event_data)
{
  switch (event_id)
  {
  case ARDUINO_USB_STARTED_EVENT:
    Serial.println("USB 连接");
    break;
  case ARDUINO_USB_STOPPED_EVENT:
    Serial.println("USB 断开");
    break;
  case ARDUINO_USB_SUSPEND_EVENT:
    Serial.printf("USB 挂起: remote_wakeup_en: %u\n", ((arduino_usb_event_data_t *)event_data)->suspend.remote_wakeup_en);
    break;
  case ARDUINO_USB_RESUME_EVENT:
    Serial.println("USB 恢复");
    break;
  default:
    break;
  }
}

void setup()
{
  Serial.begin(115200); // 初始化串口，便于调试输出
  Serial.println("Starting...");

  // 配置 SDMMC 主机参数
  sdmmc_host_t host = SDMMC_HOST_DEFAULT();
  host.max_freq_khz = SDMMC_FREQ_HIGHSPEED;                                                              // 设置最高频率
  host.flags = SDMMC_HOST_FLAG_1BIT | SDMMC_HOST_FLAG_4BIT | SDMMC_HOST_FLAG_8BIT | SDMMC_HOST_FLAG_DDR; // 支持多种模式
  host.slot = SDMMC_HOST_SLOT_1;                                                                         // 使用 SLOT1

  // 配置 SDMMC 总线参数
  sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT();
  slot_config.width = 4; // 4-bit 模式
  slot_config.clk = clk;
  slot_config.cmd = cmd;
  slot_config.d0 = d0;
  slot_config.d1 = d1;
  slot_config.d2 = d2;
  slot_config.d3 = d3;

  // 初始化 SD_MMC，挂载 SD 卡
  Serial.println("Mounting SDcard");
  // setPins 必须在 begin 之前调用，设置 SDMMC 的所有数据线
  SD_MMC.setPins((int)clk, (int)cmd, (int)d0, (int)d1, (int)d2, (int)d3);
  // begin 挂载 SD 卡，参数依次为：挂载点、1bit模式、挂载失败是否格式化、SDMMC频率
  if (!SD_MMC.begin("/sdcard", onebit, false, SDMMC_FREQ_HIGHSPEED))
  {
    Serial.println("SD 卡初始化失败");
    return;
  }

  // 获取并打印 SD 卡信息
  Serial.printf("Card Size: %lluMB\n", SD_MMC.cardSize() / (1024 * 1024));
  Serial.printf("Sector: %u\tCount: %u\n", SD_MMC.sectorSize(), SD_MMC.numSectors());

  // 初始化 USB MSC，将 SD 卡作为 U 盘导出
  Serial.println("Initializing MSC");
  if (!usbMsc.begin(&SD_MMC))
  {
    Serial.println("USB MSC 初始化失败");
    return;
  }

  // 注册 USB 事件回调，便于监控 USB 状态
  usbMsc.registerUsbEventCallback(myUsbEventHandler);

  Serial.println("Setup completed");
}

void loop()
{
}
